#ifndef SERVOIO_H__
#define SERVOIO_H__

/*servoio.h
使用硬件PWM实现舵机的控制
并使用外部终端读取外部舵机控制器
例如航模接收机、舵机测试器的输入
*/

#include <rtthread.h>
#include <rtdevice.h>

/*舵机控制信号的周期为20000000ns*/
#define SERVO_PWM_PERIOD 20000000
/*舵机控制脉宽的最小值为1000000ns*/
#define SERVO_MIN 1000000
/*舵机控制脉宽的最大值为2000000ns*/
#define SERVO_MAX 2000000
/*舵机处于中间位置的脉宽为1500000ns*/
#define SERVO_MID 1500000
/*舵机的半程脉宽差*/
#define SERVO_HALF 500000

/*s-bus下一个通道的最小值*/
#define SBUS_MIN 200
/*s-bus下一个通道的最大值*/
#define SBUS_MAX 1800
/*s-bus下一个通道的中间值*/
#define SBUS_MID 1000

typedef struct{
    char pwmdev_name[RT_NAME_MAX];
    struct rt_device_pwm *pwmdev;
    int offset;
    struct rt_pwm_configuration configuration;
} device_servo;

extern uint8_t sbus_data[25];

/*初始化舵机*/
rt_err_t servo_init(device_servo *servo, char *pwmdev_name, int channel, uint32_t init_value, int offset);

/*设置指定PWM设备控制的舵机脉宽*/
rt_err_t servo_write(device_servo *servo, uint32_t value);

/*初始化s-bus*/
rt_err_t sbus_init(char *uart_dev_name);

/*读取各个通道的值*/
uint16_t sbus_read_channel(uint8_t channel);

/*s-bus值转化为舵机脉宽*/
uint32_t sbus2servo(uint16_t sbus_val);

#endif
